package com.example.demo.executor.sqlGenerate;

import com.example.demo.entity.ExecuteConditionEntity;
import com.example.demo.entity.ExecuteInformationEntity;
import com.example.demo.entity.TableColumnEntity;

import java.util.List;

/**
 * sql语句生成接口
 */
public interface SqlGenerator {

    /**
     * 生成删除表的sql
     * @param tableName 表名
     */
    String generateDropTableSql(String tableName);

    /**
     * 根据表生成备份表的建表sql
     * @param tableName 原表名称
     * @param backupTableName 需要创建的表的名称
     */
    String generateCreateTableSql(String tableName, String backupTableName);

    /**
     * 生成检查表是否存在的sql
     */
    String generateCheckTableExistSql(String tableName);

    /**
     * 将tableName中符合条件的数据备份到backupTableName中
     * 如果conditions中不存在数据，备份全部数据
     * @param tableName 数据来源表
     * @param backupTableName  数据备份表
     * @param column tableName中的列
     * @param conditions column列中的数据
     */
    String generateDataArchiveSql(String tableName, String backupTableName, String column, List<Object> conditions);

    /**
     * 将tableName中满足column字段的值在conditions的数据删除
     * @return 删除的条数
     */
    String generateDeleteSql(String tableName, String column, List<Object> conditions);

    /**
     * 统计满足条件的数据量
     * @return
     */
    String generateCountNeedDealSizeSql(String tableName, String condition);

    /**
     * 生成统计表中所有数据的sql
     */
    String generateCountAllDataSizeSql(String tableName);

    /**
     * 查询表的列信息
     * @return 表的列信息集合
     */
    String generateQueryColumnInfoSql(String tableName);

    /**
     * 根据执行信息生成执行sql的条件
     */
    String generateExecuteConditionSql(ExecuteInformationEntity informationEntity);
    /**
     * 从关联信息中得到查询条件
     * @return
     */
    String generateExecuteConditionSql(ExecuteConditionEntity executeCondition);


    String generateAllParamQuerySql(String tableName, List<String> columns, String condition);

    String generatePartParamQuerySql(String paramQuerySql, String sortColumn, String sortType, Integer limit);

    /**
     * 得到对应的数据库名称
     */
    String getDatabaseName();

}
